﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebRamosUC.Models
{
    public partial class Curso
    {
        /// <summary>
        /// Retorna las secciones que se estan cursando actualmente.
        /// </summary>
        public IEnumerable<Seccion> GetSeccionesActuales()
        {
            Periodo periodo = new RepositorioPeriodo().GetPeriodoActual();

            return GetSecciones(periodo.Anio, periodo.Semestre);
        }

        /// <summary>
        /// Retorna secciones de un periodo particular (basandose en IDPeriodo).
        /// </summary>
        public IEnumerable<Seccion> GetSecciones(Periodo periodo)
        {
            return from seccion in Secciones
                   where seccion.Periodo.IDPeriodo == periodo.IDPeriodo
                   orderby seccion.NumSeccion
                   select seccion;
        }

        /// <summary>
        /// Retorna secciones de un anio y semestre en particular (TAV = 0)
        /// </summary>
        public IEnumerable<Seccion> GetSecciones(int anio, int semestre)
        {
            return from seccion in Secciones
                   where (seccion.Periodo.Anio == anio && seccion.Periodo.Semestre == semestre)
                   orderby seccion.NumSeccion
                   select seccion;

        }

        public IEnumerable<Seccion> GetSecciones()
        {
            return Secciones.ToList();
        }

        public IEnumerable<Recomendacion> GetRecomendaciones()
        {
            List<Recomendacion> recs = new  List<Recomendacion>();

            foreach (Seccion sec in Secciones)
                recs.AddRange(sec.GetRecomendaciones());

            recs.OrderBy(r => r.Fecha);

            return recs;
        }

        /// <summary>
        /// Retorna todos los profesores que han hecho un curso
        /// </summary>
        public IEnumerable<Profesor> GetProfesores()
        {
            List<Profesor> profes = new List<Profesor>();
            foreach (Seccion s in Secciones)
            {
                IEnumerable<Profesor> aux = s.GetProfesores();

                foreach (Profesor p in aux)
                {
                    if (!profes.Contains(p))
                        profes.Add(p);
                }
            }
            return profes;
        }

        /// <summary>
        /// Retorna el promedio de las calificaciones que ha recibido este curso.
        /// Numeros enteros o ,5
        /// </summary>
        /// <returns></returns>
        public double CalificacionPromedio()
        {
            double promedio = CalificacionPromedioExacta();

            //Lo aproximamos a medios o enteros, pero no mas, pra las estrellitas
            
            int minimo = (int)promedio; //en minimo queda el numero entero

            promedio -= minimo; //en promedio quedan solo los decimales

            if (promedio < 0.25)
                promedio = 0;
            else if (promedio < 0.75)
                promedio = 0.5;
            else
                promedio = 1;

            // sumamos de nuevo el entero a promedio
            promedio += minimo;


            return promedio;
        }

        /// <summary>
        /// Retorna el promedio de las calificaciones que ha recibido este curso.
        /// </summary>
        /// <returns></returns>
        public double CalificacionPromedioExacta()
        {
            double result = 0.0;
            int count = 0;
            //Itero por todas las recomendaciones de todas las secciones.
            foreach (var secc in Secciones)
            {
                foreach (var rec in secc.Recomendaciones)
                {
                    if (rec.Activo)
                    {
                        result += rec.Valor;
                        count++;
                    }
                }
            }

            return (count != 0) ? (result / count) : 0;   //Dejemos la division por cero para CHUCK NORRIS
        }

        /// <summary>
        /// nombre-sigla
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return NombreCurso+" - "+Sigla;
        }

        /// <summary>
        /// sigla - nombre
        /// </summary>
        /// <returns></returns>
        public string ToString2()
        {
            return Sigla + " - " + NombreCurso;
        }


        public bool UserHasPost(string userName)
        {
            foreach (Recomendacion rec in GetRecomendaciones())
                if (rec.Usuario.Nombre == userName && rec.Activo)
                    return true;

            return false;
        }
    }
}